/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package op;

/**
 *
 * @author Jonatas
 */
public class Telefone implements Comparable<Telefone>, Cloneable {

    private String ddi;
    private String ddd;
    private String numParte1;
    private String numParte2;
    private String numero;
    private boolean foneDiferente = false;
    private String numDiferente;

    @Override
    public Telefone clone() {

        Telefone telefone = new Telefone();
        telefone.ddd = this.ddd;
        telefone.ddi = this.ddi;
        telefone.numParte1 = this.numParte1;
        telefone.numParte2 = this.numParte2;
        telefone.numero = this.numero;
        telefone.foneDiferente = this.foneDiferente;
        telefone.numDiferente = this.numDiferente;

        return telefone;
    }

    private Telefone() {
    }

    public boolean isDiferente() {
        return foneDiferente;
    }

    public Telefone(String numDiferente, boolean diferente) {
        this.numDiferente = numDiferente;
        foneDiferente = true;
    }

    public String getDdi() {
        return ddi;
    }

    public void setDdi(String ddi) {
        this.ddi = ddi;
        this.setNumero();
    }

    public Telefone(String numero) {

        if (numero.length() == 12) {
            ddi = numero.substring(0, 2);

            if (ddi.equals("55")) {
                ddi = "";
            }

            ddd = numero.substring(2, 4);
            ddd = "0" + ddd;
            numParte1 = numero.substring(4, 8);
            numParte2 = numero.substring(8);

            setNumero();
        } else {

            if (numero.length() < 3) {

                this.foneDiferente = true;
                this.numDiferente = numero;

            } else {

                ddi = "";
                ddd = numero.substring(0, 3);
                String aux = numero.substring(3);

                if (aux.length() > 4) {
                    numParte1 = numero.substring(3, 7);
                    numParte2 = numero.substring(7);
                } else {
                    numParte1 = aux;
                    numParte2 = "";
                }

                setNumero();

            }


        }

    }

    public Telefone(String ddd, String num1, String num2) {

        if (ddd.length() < 3) {
            this.ddd = "0" + ddd;
        } else {
            this.ddd = ddd;
        }

        this.ddi = "";
        this.numParte1 = num1;
        this.numParte2 = num2;

        setNumero();
    }

    public Telefone(String num1, String num2) {

        this.ddd = "";

        this.ddi = "";
        this.numParte1 = num1;
        this.numParte2 = num2;

        setNumero();
    }

    public String getDdd() {
        return ddd;
    }

    public void setDdd(String ddd) {
        if (ddd.length() < 3) {
            ddd = "0" + ddd;
        }
        this.ddd = ddd;
        setNumero();
    }

    public String getNumParte1() {
        return numParte1;
    }

    public void setNumParte1(String numParte1) {
        this.numParte1 = numParte1;
        setNumero();
    }

    public String getNumParte2() {
        return numParte2;
    }

    public void setNumParte2(String numParte2) {
        this.numParte2 = numParte2;
        setNumero();
    }

    private void setNumero() {

        if (!ddi.equals("")) {
            this.numero = ddi;
        } else {
            this.numero = "";
        }

        if (numParte2.equals("")) {
            this.numero += " (" + ddd + ") " + numParte1;
        } else {
            this.numero += " (" + ddd + ") " + numParte1 + "-" + numParte2;
        }
    }

    @Override
    public String toString() {
        if (this.foneDiferente) {
            return numDiferente;
        }
        return this.numero;
    }

    public String toUnformattedString() {
        if (this.foneDiferente) {
            return removeFrescura(numDiferente);
        }
        return removeFrescura(this.numero);
    }

    private String removeFrescura(String original) {
        String regex = "[^0-9]";
        return original.replaceAll(regex, "");
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Telefone other = (Telefone) obj;
        if (this.foneDiferente && other.foneDiferente) {
            return this.numDiferente.equals(other.numDiferente);
        }
        if ((this.numero == null) ? (other.numero != null) : !this.numero.equals(other.numero)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 97 * hash + (this.numero != null ? this.numero.hashCode() : 0);
        return hash;
    }

    public int compareTo(Telefone o) {
        if (this.foneDiferente && o.foneDiferente) {
            return numDiferente.compareTo(o.numDiferente);
        } else if (this.foneDiferente) {
            return 1;
        } else if (o.foneDiferente) {
            return -1;
        }
        return numero.compareTo(o.numero);
    }
}
